OktaからIAM Identity CenterにIDを自動でプロビジョニングしてみた - Workflows編
こんにちは、ゲームソリューション部/業務効率化ソリューション部の新屋です。
本ブログはClassmethod ゲーソル・ギョーソル Advent Calendar 2024の21日目のブログとなります。
さて今日は「OktaのアイデンティティをAWS IAM Identity Centerに自動プロビジョニングする方法について」…は先日紹介しました。
今日はOktaからAWS IAM Identity Centerにプロビジョニングする別のアプローチをご紹介します。題して「OktaからIAM Identity CenterにIDを自動でプロビジョニングしてみた - Workflows編」です。
前提
- AWS IAM Identity CenterとOktaが統合され、AWSアカウントにシングルサインオンができる状態
- IAM Identity CenterのSCIM連携を無効化している状態
- 有効化しているとSCIM連携先からのユーザー作成しかできません
モチベーション
- 先日紹介したLifecycle Managementによるプロビジョニングは、プロビジョニング先がSCIMに対応していることが前提となるので、SCIM非対応のサービスと連携したい。
- さらにLifecycle Managementは有償のライセンスなので、これから紹介するWorkflowsの無料枠内で擬似的な自動プロビジョニングを構成したい。
達成するシナリオ
- Oktaのユーザーを作成し、そのユーザーをAWS IAM Identity Centerに割り当てると、AWS IAM Identity Center側のユーザーが自動で作成され、シングルサインオンができるようになる
実装および設定手順
(AWS)IAM Identity Centerのユーザーを作成するLambda関数を作成・設定する
import boto3
import uuid
import os
import json
def lambda_handler(event, context):
identitystore = boto3.client('identitystore')
instance_id = os.environ.get('IDENTITY_CENTER_INSTANCE_ID')
if not instance_id:
return {
'statusCode': 400,
'body': 'Error: IDENTITY_CENTER_INSTANCE_ID environment variable is not set.'
}
try:
user_data = event
if not user_data:
return {
'statusCode': 400,
'body': 'Error: Request payload is empty.'
}
except Exception as e:
return {
'statusCode': 400,
'body': f'Error: Invalid payload format: {e}'
}
if not all(key in user_data for key in ['UserName', 'DisplayName', 'GivenName', 'FamilyName', 'Emails']):
return {
'statusCode': 400,
'body': 'Error: Missing required user information in request payload.'
}
try:
response = identitystore.create_user(
IdentityStoreId=instance_id,
UserName=user_data['UserName'],
DisplayName=user_data['DisplayName'],
Name={
'GivenName': user_data['GivenName'],
'FamilyName': user_data['FamilyName']
},
Emails=user_data['Emails']
)
print(f"User created successfully: {response}")
user_id = response['UserId']
print(f"Created user ID: {user_id}")
user_info = identitystore.describe_user(
IdentityStoreId=instance_id,
UserId=user_id
)
print(f"User info: {user_info}")
return {
'statusCode': 200,
'body': f'User created successfully. User ID: {user_id}'
}
except Exception as e:
print(f"Error creating user: {e}")
return {
'statusCode': 500,
'body': f'Error creating user: {e}'
}
ロールのポリシーには、IAM Identity Centerのユーザーを操作できる権限を追加してください。
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"identitystore:CreateUser"
],
"Resource": "arn:aws:identitystore::{account_id}:identitystore/d_{instance_id}"
},
{
"Effect": "Allow",
"Action": [
"identitystore:DescribeUser",
"identitystore:ListUsers"
],
"Resource": [
"arn:aws:identitystore::{account_id}:identitystore/d_{instance_id}",
"arn:aws:identitystore:::user/*"
]
}
]
}
環境変数は、以下を設定しましょう。
IDENTITY_CENTER_INSTANCE_ID=d_{instance_id}
各変数はIAM Identity Centerの設定から確認してください。
(AWS)Okta側からLambda呼び出しで使用するIAM Userを作成する
最後にIAM Userのアクセスキーを作成、取得しておきます。これはOkta側からLambdaを呼び出すユーザーとなるので、必要以上の権限を与えないよう注意が必要です。
(Okta)Workflowsを開始する
管理画面のメニューからWorkflowsコンソールを開きます。
新しいFlowを作成します。
(Okta)このWorkflowが、ユーザーをOktaのIAM Identity Centerアプリケーションに割り当てたときに起動するように設定する
Add event で Okta > User Assigned to Application を選択します。
Connectionを入力します。
コネクション情報は管理画面 > アプリケーション > Okta Workflows OAuth > 認証 から確認します。
Domain名はテナントのドメイン名です。URLを参照しましょう。
httpsや-adminは取り除いてください、この場合は demo-teal-emu-xxxxxxxxxx.okta.com です。
そうすると、User Assigned to Application カードを設定できるようになります。
(Okta)IAM Identity Centerに送るユーザー情報を取得する
次に Add app action から Okta > Read User カードを設定します。
そうしたらカード同士をつなぎます。こんな感じです。
(Okta)Lambda関数を実行する設定をする
Add app actionから AWS Lambda > Invoke を選択し、コネクションを設定します。
Access KeyとAccess Secretは、先ほど作成したIAM Userの情報を入れてください。RegionはLambda関数を作成したリージョンを選択します。
Invoke Functionは、先ほど作成した関数を選択します。
(Okta)Lambda関数のペイロードに渡すユーザー情報を整形する
カード追加から 電卓マーク > Object > Construct を選択します。
カードの設定はこんな感じです。
Key名は変更できまして、IAM Identity Centerのユーザー作成に必要なKey名にしておく必要があります。ValueとPrimaryと変更しておきましょう。
Primaryは常にTrueに設定してください。
完成はこんな感じ
またカードを追加します。List >Construct を選択します。
もうひとつ、Object Constructカードを作成します。
Key名は、UserName, DisplayName, GivenName, FamilyName, Emailsです。
そうしたら、カードをつないでいきます。
ちなみにRead User の UsernameはEmailの形式である前提です。
OktaはデフォルトではUsernameはEmail形式です。
全体像はこんな感じです。
これでSave&Flow is ONにしてください。
動作確認
IAM Identity Centerのユーザー割り当てを行いましょう。
割り当てたら、IAM Identity Centerにユーザーが出来ていることを確認します。
最後にシングルサインオンできるかチェックします。
AWSアクセスポータルにサインインできました。
さいごに
Workflowでこのような自動化ができ、実装次第でいろいろなオペレーションを柔軟に自動化できます。手間が掛かりますが、Lifecycle Managementが使えない状況だと有効な手段ではないでしょうか。
以上です。